//============================================================================
// Name        : cpp_curl_mailsend.cpp
// Author      : darkflash
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

using namespace std;

struct upload_status {
  int lines_read;
};

#define FROM    "<darkflash76@gmail.com>"
#define TO      "<darkflash@empal.com>"
#define CC      "<darkflash76@gmail.com>"

//static const char *payload_text[9];
static const char *payload_text[] = {
  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
  "To: " TO "\r\n",
  "From: " FROM "(Example User)\r\n",
  "Cc: " CC "(Another example User)\r\n",
  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n",
  "Subject: SMTP TLS example message\r\n",
  "\r\n", /* empty line to divide headers from body, see RFC5322 */
  "The body of the message starts here.\r\n",
  "\r\n",
  "It could be a lot of lines, could be MIME encoded, whatever.\r\n",
  "Check RFC5322.\r\n",
  NULL
};

static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
{
  struct upload_status *upload_ctx = (struct upload_status *)userp;
  const char *data;

  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
    return 0;
  }

  data = payload_text[upload_ctx->lines_read];

  if(data) {
    size_t len = strlen(data);
    memcpy(ptr, data, len);
    upload_ctx->lines_read++;

    return len;
  }

  return 0;
}

int main() {

	cout << "input smtp url: ";
	string input_smtp_url;
	cin >> input_smtp_url;

	cout << "input smtp auth user: ";
	string input_smtp_auth_user;
	cin >> input_smtp_auth_user;

	cout << "input smtp auth password: ";
	string input_smtp_auth_password;
	cin >> input_smtp_auth_password;

/*
	cout << "input from: ";
	string input_from;
	cin >> input_from;

	cout << "input to: ";
	string input_to;
	cin >> input_to;

	cout << "input subject: ";
	string input_subject;
	cin >> input_subject;

	cout << "input message: ";
	string input_message;
	cin >> input_message;

	input_from = "<" + input_from + ">";
	input_to = "<" + input_to + ">";
*/

	/*payload_text[0] = string("Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n").c_str();
	payload_text[1] = string("To: " + input_to + "\r\n").c_str();
	payload_text[2] = string("From: " + input_from + "(Example User)\r\n").c_str();
	payload_text[3] = string("Cc: " CC "(Another example User)\r\n").c_str();
	payload_text[4] = string("Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n").c_str();
	payload_text[5] = string("Subject: " + input_subject + "\r\n").c_str();
	payload_text[6] = string("\r\n").c_str();
	payload_text[7] = string(input_message + "\r\n").c_str();
	payload_text[8] = NULL;*/

	/*
	payload_text[0] = "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n";
	payload_text[1] = "To: " TO "\r\n";
	payload_text[2] = "From: " FROM "(Example User)\r\n";
	payload_text[3] = "Cc: " CC "(Another example User)\r\n";
	payload_text[4] = "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n";
	payload_text[5] = "Subject: SMTP TLS example message\r\n";
	payload_text[6] = "\r\n";
	payload_text[7] = "The body of the message starts here.\r\n";
	payload_text[8] = NULL;
	*/

	CURL *curl;
	  CURLcode res = CURLE_OK;
	  struct curl_slist *recipients = NULL;
	  struct upload_status upload_ctx;

	  upload_ctx.lines_read = 0;

	  curl = curl_easy_init();
	  if(curl) {
	    /* Set username and password */
	    curl_easy_setopt(curl, CURLOPT_USERNAME, input_smtp_auth_user.c_str());
	    curl_easy_setopt(curl, CURLOPT_PASSWORD, input_smtp_auth_password.c_str());

	    /* This is the URL for your mailserver. Note the use of port 587 here,
	     * instead of the normal SMTP port (25). Port 587 is commonly used for
	     * secure mail submission (see RFC4403), but you should use whatever
	     * matches your server configuration. */
	    curl_easy_setopt(curl, CURLOPT_URL, input_smtp_url.c_str());

	    /* In this example, we'll start with a plain text connection, and upgrade
	     * to Transport Layer Security (TLS) using the STARTTLS command. Be careful
	     * of using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer
	     * will continue anyway - see the security discussion in the libcurl
	     * tutorial for more details. */
	    curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);

	    /* Note that this option isn't strictly required, omitting it will result in
	     * libcurl sending the MAIL FROM command with empty sender data. All
	     * autoresponses should have an empty reverse-path, and should be directed
	     * to the address in the reverse-path which triggered them. Otherwise, they
	     * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details.
	     */
	    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM);

	    /* Add two recipients, in this particular case they correspond to the
	     * To: and Cc: addressees in the header, but they could be any kind of
	     * recipient. */
	    recipients = curl_slist_append(recipients, TO);
	    recipients = curl_slist_append(recipients, CC);
	    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);

	    /* We're using a callback function to specify the payload (the headers and
	     * body of the message). You could just use the CURLOPT_READDATA option to
	     * specify a FILE pointer to read from. */
	    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
	    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
	    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);

	    /* Since the traffic will be encrypted, it is very useful to turn on debug
	     * information within libcurl to see what is happening during the transfer.
	     */
	    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

	    /* Send the message */
	    res = curl_easy_perform(curl);

	    /* Check for errors */
	    if(res != CURLE_OK)
	      fprintf(stderr, "curl_easy_perform() failed: %s\n",
	              curl_easy_strerror(res));

	    /* Free the list of recipients */
	    curl_slist_free_all(recipients);

	    /* Always cleanup */
	    curl_easy_cleanup(curl);
	  }

	  return (int)res;
}
